home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / parser / s_number.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-01-31  |  2.2 KB  |  111 lines

  1. # include    <ingres.h>
  2. # include    <aux.h>
  3. # include    "scanner.h"
  4. # include    <sccs.h>
  5. # include    <errors.h>
  6.  
  7. SCCSID(@(#)s_number.c    8.3    1/31/86)
  8.  
  9. /*
  10. ** NUMBER
  11. **    scans numerical constants (both integer and floating).  Each
  12. **    constant is converted from ascii to its numerical representation
  13. **    and is entered into the symbol table, indexed by 'yylval'.
  14. **    A token is returned for the number type.
  15. **
  16. **    due to the current atof in the utility library, floating overflow
  17. **    is not checked.
  18. */
  19. number(chr)
  20. char    chr;
  21. {
  22.     extern char    Cmap[];
  23.     extern int    yylval;
  24.     double        ftemp;
  25.     long        ltemp;
  26.     short        itemp;
  27.     char        buf[256];
  28.     register int    lsave;
  29.     register char    *ptr;
  30.  
  31.     lsave = Lcase;
  32.     Lcase = 0;
  33.     ptr = buf;
  34.     if ((*ptr = chr) != '.')
  35.     {
  36.         do
  37.         {
  38.             /* get integer portion */
  39.             if ((ptr - buf) >= 256)
  40.                 /* buffer overflow */
  41.                 par_error(NUMBUFOFLO, WARN, 0);
  42.             *++ptr = get_scan(NORMAL);
  43.         } while (Cmap[*ptr] == NUMBR);
  44.     }
  45.  
  46.     /* do rest of type determination */
  47.     switch (*ptr)
  48.     {
  49.       case '.':
  50.         /* floating point */
  51.         do
  52.         {
  53.             /* fill into ptr with up to next non-digit */
  54.             if ((ptr - buf) >= 256)
  55.                 par_error(NUMBUFOFLO, WARN, 0);    /* buf oflo */
  56.             *++ptr = get_scan(NORMAL);
  57.         } while (Cmap[*ptr] == NUMBR);
  58.         if (*ptr != 'e' && *ptr != 'E')
  59.         {
  60.             backup(*ptr);
  61.             *ptr = 0;
  62.             goto convr;
  63.         }
  64.  
  65.       case 'e':
  66.       case 'E':
  67.         if ((ptr - buf) >= 256)
  68.             par_error(NUMBUFOFLO, WARN, 0);    /* buf oflo */
  69.         *++ptr = get_scan(NORMAL);
  70.         if (Cmap[*ptr] == NUMBR || *ptr == '-' || *ptr == '+')
  71.         {
  72.             do
  73.             {
  74.                 /* get exponent */
  75.                 if ((ptr - buf) >= 256)
  76.                     par_error(NUMBUFOFLO, WARN, 0);    /* buf oflo */
  77.                 *++ptr = get_scan(NORMAL);
  78.             } while (Cmap[*ptr] == NUMBR);
  79.         }
  80.         backup(*ptr);
  81.         *ptr = 0;
  82.     convr:
  83.         if (atof(buf, &ftemp))
  84.             par_error(FCONSTERR, WARN, buf, 0);    /* floating conversion error */
  85.         yylval = syment(&ftemp, 8);
  86.         Lastok.toktyp = Tokens.f8const;
  87.         break;
  88.  
  89.       default:
  90.         /* integer */
  91.         backup(*ptr);
  92.         *ptr = 0;
  93.         if (atol(buf, <emp))    /* long conversion error */
  94.             goto convr;
  95.         if (ltemp > 32767)
  96.         {
  97.             yylval = syment(<emp, 4);
  98.             Lastok.toktyp = Tokens.i4const;
  99.             break;
  100.         }
  101.         itemp = ltemp;
  102.         yylval = syment(&itemp, 2);
  103.         Lastok.toktyp = Tokens.i2const;
  104.         break;
  105.     }
  106.     Lcase = lsave;
  107.     Lastok.tok = (char *) yylval;
  108.     Lastok.tokop = 0;
  109.     return (Lastok.toktyp);
  110. }
  111.